#include <iostream>
#include <string>

/*
this 的好处 
    解决同名问题
使用this 时需要注意的问题
    stu * s1 = NULL;
        上述代码 会造成 s1 内部的 this == NULL
        如果内部使用 this 去进行操作 则会造成 段错误 (核心已转储)

*/

using namespace std;

class stu
{
private:
    int val;  // 成员变量val，类型为int

public:
    int *ptr;  // 成员变量ptr，指针类型，指向一个int

public:
    // 默认构造函数，初始化val为10
    stu() : val(10)
    {
    }

    // 参数化构造函数，初始化val和ptr
    stu(int val , int ptr_val) : 
        val(val) , ptr(new int(ptr_val))  // 动态分配内存给ptr
    {

    }

    // 拷贝构造函数，执行深拷贝
    stu(const stu &other)
    {
        cout << "调用拷贝构造函数" << endl;
        if (NULL == other.ptr)
        {
            // 如果传入的ptr是NULL，则直接将ptr赋值为NULL
            ptr = other.ptr;
        }
        else
        {
            // 如果传入的ptr不是NULL，则创建新的内存空间，并拷贝值
            ptr = new int(*other.ptr);  // 创建新的内存空间并拷贝ptr指向的值
        }

        val = other.val;  // 拷贝val值
    }

    // 析构函数，释放动态分配的内存
    ~stu()
    {
        if(NULL != ptr)
        {
            cout << "调用析构 释放空间完成" << endl;
            delete ptr;  // 释放ptr指向的内存
        }
    }

public:
    // 显示val和ptr指向的值
    void show()
    {
        cout << val << endl;
        cout << *ptr << endl;  // 输出ptr指向的值
    }

public:
    // 注释掉的赋值运算符重载（此时尚未实现）
    // const stu &operator=(const stu &other)
    // {
    //     cout << "调用了等于号" << endl;
    // }
};

int main(int argc, char const *argv[])
{
    stu s1(10 , 20);  // 使用带参构造函数创建对象s1，val=10，ptr指向20

    stu s2(s1);  // 使用拷贝构造函数创建对象s2，拷贝s1的值
    *s1.ptr = 90;  // 修改s1.ptr指向的值为90
    s2.show();  // 显示s2的值，应该输出10和20

    return 0;
}
